﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;
using UtilityExtensions;
using System.Data.SqlClient;
namespace BOL
{
    [Serializable]
    public class ProveedorBL
    {
        #region "CRUD"


        public int add(string descripcion,
                        string abreviacion,
                        char tipoProveedor,
                        char estado,
                        string ApellidoPat,
                        string ApellidoMat,
                        string Nombre,
                        int idFormaPago,
                        string email,
                        string web,
                        string ruc,
                        string contacto,
                        int tipodocumento,
                        string docContacto,
                        string emailContacto,
                        int? tipoDocContacto,
                        string direccionOficina,
                        string telefonoOficina1,
                        string telefonoOficina2,
                        string distritoOficina,
                        string anexoOficina,
                        string faxOficina,
                        string direccionDesp,
                        string telefonoDesp1,
                        string telefonoDesp2,
                        string distritoDesp,
                        string anexoDesp,
                        string faxDesp,
                        string ubigeo,
                        string tipoAcreedor,
                        string  giroNegocio,
                        string   formaPagoG,
                        string            clasificacion,
                        string            detraccion,
                        string            retencion,
                        string            importeMoneda,
                        decimal            importeRendir,
                        string areaContactoPago,
                        string contactoPago,
                        string	teleCuentaSOL ,
                        string	teleCuentaDOL ,
                        string teleTipoProducto,
                        string teleTipoDoc,
                        string	teleDocumento,
                        string	teleInterBan ,
                        string	IntcuentaSOL  ,
                        string	intcuentaDOL ,
                        string intTipoProducto,
                        string intTipoBono,
                        string	intOficina  ,
                        string intTipoDocumento,
                        string	intNroDocumento,
                        string	intInterBan  ,
                        string	continentCuentaSOL,
                        string	continentCuentaDOL ,
                        string continentFormaPago,
                        string continentTipoCuenta,
                        string continenttipoDoc,
                        string	continentNroDoc,
                        string	continentInterBan,
                        string	nacionDetraccion,
                        string	nacionInterBan,
                        string scotiaCuentaSOL,
                        string scotiaCuentaDOL,
                        string scotiaInterBan,
                        string scotiaFormaPago)
        {
               using (TransactionScope ts = new TransactionScope())
                {

                    dbGestionDataContext _db =
                        new dbGestionDataContext(Parametros.strConnString);

                    int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                    //--------------------
                    bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                        idEmpleadoEmisor,
                        11,
                         2);
                    //-------------------------

                    if (tipoProveedor == 'J')
                    {
                        ApellidoMat = "";
                        ApellidoPat = "";
                        Nombre = "";
                    }
                    else
                    {
                        abreviacion = "";
                        descripcion = Nombre + " " + ApellidoPat + " " + ApellidoMat;
                    }
                    if (ruc == string.Empty)
                    {
                        throw new Exception("Verifique Nro Documento del Proveedor");
                    }

                    var prov = from a in _db.Proveedors
                               where a.ruc.Trim() == ruc.Trim()
                               select a;
                    if (prov.Count()>0)
                    {
                        throw new Exception("Existe Proveedor Registrado {0}{1}".Fmt(prov.First().ruc,prov.First().descripcion));
                    }

                    


                   if (tipodocumento==6 & ruc.Trim().Length!=11)
                   {
                          throw new Exception("Verifique RUC debe existir 11 digitos {0}{1}".Fmt(prov.First().ruc,prov.First().descripcion));
                   }
                        


                    Proveedor dbProveedor = new Proveedor();
                    dbProveedor.setAdd(_db,
                                    ruc.Trim(),
                                    descripcion,
                                    abreviacion,
                                    idFormaPago,
                                    email,
                                    web,
                                    ruc.Trim(),
                                    contacto,
                                    tipodocumento,
                                    docContacto,
                                    emailContacto,
                                    tipoDocContacto,
                                    direccionOficina,
                                    telefonoOficina1,
                                    telefonoOficina2,
                                    distritoOficina,
                                    anexoOficina,
                                    faxOficina,
                                    direccionDesp,
                                    telefonoDesp1,
                                    telefonoDesp2,
                                    distritoDesp,
                                    anexoDesp,
                                    faxDesp,
                                    idEmpleadoEmisor,
                                    estado,
                                    tipoProveedor,
                                    Nombre,
                                    ApellidoPat,
                                    ApellidoMat,
                                    ubigeo,
                                    tipoAcreedor,
                                    giroNegocio,
                                    formaPagoG,
                                    clasificacion,
                                    importeRendir,
                                    detraccion,
                                    retencion,
                                    importeMoneda,
                                    areaContactoPago,
                                    contactoPago);

                    _db.SubmitChanges();

                   var proveedorCuenta= new ProveedorCuenta();

                   proveedorCuenta.SetAdd(_db,dbProveedor.idInternal,teleCuentaSOL,teleCuentaDOL,teleTipoProducto,teleTipoDoc,teleDocumento,teleInterBan,
                                            IntcuentaSOL,intcuentaDOL,intTipoProducto,intTipoBono,intOficina,intTipoDocumento,intNroDocumento,intInterBan,
                                            continentCuentaSOL,continentCuentaDOL,continentFormaPago,continentTipoCuenta,Convert.ToChar(continenttipoDoc),continentNroDoc,continentInterBan,
                                            nacionDetraccion,nacionInterBan,scotiaCuentaSOL,scotiaCuentaDOL,scotiaInterBan,scotiaFormaPago,idEmpleadoEmisor);

                    _db.SubmitChanges();
                    
                   //-----------------------
                    char tipoAnexo = dbProveedor.GettipoAnexo();
                    this.UpdateGesPag(_db, dbProveedor.idInternal, tipoAnexo);
                    //-------------------------------
                    ts.Complete();

                    return dbProveedor.idInternal;                 
                }
                
            }


        public bool updateProveedor(int idInternal,
                            string descripcion,
                            string abreviacion,
                            char estado,
                            string nombre,
                            string apellidoPat,
                            string apellidoMat,
                            int idFormaPago,
                            string email,
                            string web,
                            string contacto,
                            int tipodocumento,
                            string docContacto,
                            string emailContacto,
                            int? tipoDocContacto,
                            string direccionOficina,
                            string telefonoOficina1,
                            string telefonoOficina2,
                            string distritoOficina,
                            string anexoOficina,
                            string faxOficina,
                            string direccionDesp,
                            string telefonoDesp1,
                            string telefonoDesp2,
                            string distritoDesp,
                            string anexoDesp,
                            string faxDesp,
          
                        string ubigeo,
                        string tipoAcreedor,
                        string giroNegocio,
                        string formaPagoG,
                        string clasificacion,
                        string detraccion,
                        string retencion,
                        string importeMoneda,
                        decimal importeRendir,
                        string areaContactoPago,
                        string contactoPago,
                        string teleCuentaSOL,
                        string teleCuentaDOL,
                        string teleTipoProducto,
                        string teleTipoDoc,
                        string teleDocumento,
                        string teleInterBan,
                        string IntcuentaSOL,
                        string intcuentaDOL,
                        string intTipoProducto,
                        string intTipoBono,
                        string intOficina,
                        string intTipoDocumento,
                        string intNroDocumento,
                        string intInterBan,
                        string continentCuentaSOL,
                        string continentCuentaDOL,
                        string continentFormaPago,
                        string continentTipoCuenta,
                        string continenttipoDoc,
                        string continentNroDoc,
                        string continentInterBan,
                        string nacionDetraccion,
                        string nacionInterBan,
                        string scotiaCuentaSOL,string scotiaCuentaDOL,string scotiaInterBan,string scotiaFormaPago)     

        {
            
              int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            
              bool result = false;
                using (TransactionScope ts = new TransactionScope())
                {
                    dbGestionDataContext _db =
                        new dbGestionDataContext(Parametros.strConnString);
                    //--------------------
                    bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                        idEmpleadoEmisor,
                        11,
                         3);
                    //------------------------- 
  
                 

                    Proveedor dbProveedor = _db.Proveedors.Single(p => p.idInternal == idInternal);
                    ProveedorCuenta proveedorCuenta = _db.ProveedorCuentas.SingleOrDefault(p => p.idProveedor == idInternal);
                    //compara cambios y solo actualiza los cambiados

                    if (dbProveedor.tipo == 'J')
                    {
                        apellidoMat = "";
                        apellidoPat = "";
                        nombre = "";
                    }
                    else
                    {
                        abreviacion = "";
                        descripcion = nombre + " " + apellidoPat + " " + apellidoMat;
                    }

                    dbProveedor.setUpdate(descripcion,abreviacion,idFormaPago,
                                             email, web,
                                             contacto, tipodocumento, docContacto, emailContacto, tipoDocContacto,direccionOficina, telefonoOficina1, telefonoOficina2, distritoOficina, anexoOficina, faxOficina,
                                             direccionDesp,telefonoDesp1,telefonoDesp2,  distritoDesp, anexoDesp,  faxDesp,  idEmpleadoEmisor,
                                             estado,nombre,apellidoPat,apellidoMat,ubigeo,tipoAcreedor,giroNegocio,formaPagoG,clasificacion,importeRendir,detraccion,retencion,  importeMoneda,areaContactoPago,contactoPago);

                    if(proveedorCuenta==null)
                    {
                        proveedorCuenta = new ProveedorCuenta();
                        proveedorCuenta.SetAdd(_db, dbProveedor.idInternal, teleCuentaSOL, teleCuentaDOL, teleTipoProducto, teleTipoDoc, teleDocumento, teleInterBan,
                                         IntcuentaSOL, intcuentaDOL, intTipoProducto, intTipoBono, intOficina, intTipoDocumento, intNroDocumento, intInterBan,
                                         continentCuentaSOL, continentCuentaDOL, continentFormaPago, continentTipoCuenta, Convert.ToChar(continenttipoDoc), continentNroDoc, continentInterBan,
                                         nacionDetraccion, nacionInterBan,scotiaCuentaSOL,scotiaCuentaDOL,scotiaInterBan,scotiaFormaPago, idEmpleadoEmisor);


                        _db.SubmitChanges();
                    }
                    else
                    {
                        proveedorCuenta.SetUpdate(teleCuentaSOL, teleCuentaDOL, teleTipoProducto,teleTipoDoc, teleDocumento, teleInterBan,
                                            IntcuentaSOL, intcuentaDOL, intTipoProducto, intTipoBono, intOficina, intTipoDocumento, intNroDocumento, intInterBan,
                                            continentCuentaSOL, continentCuentaDOL, continentFormaPago, continentTipoCuenta, Convert.ToChar(continenttipoDoc), continentNroDoc, continentInterBan,
                                            nacionDetraccion, nacionInterBan,scotiaCuentaSOL,scotiaCuentaDOL,scotiaInterBan,scotiaFormaPago, idEmpleadoEmisor);


                        _db.SubmitChanges();
                    }
                   //para el caso de gespag
                   char tipoAnexo = dbProveedor.GettipoAnexo();
                   this.UpdateGesPag(_db, idInternal,tipoAnexo);

                    _db.SubmitChanges();
                   ts.Complete();
                   result=true;
                }
                return result;
            }
           
          
        public bool delete(int idProveedor)
        {
           
                bool result=false;
                using (TransactionScope ts = new TransactionScope())
                {

                    dbGestionDataContext _db;
                    _db = new dbGestionDataContext(Parametros.strConnString);

                    Proveedor local = _db.Proveedors.Single(p => p.idInternal == idProveedor);
                    int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            
                    //--------------------
                    bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                        idEmpleadoEmisor,
                        11,
                         4);
                    //-------------------------   

                    if (local.Comparativos.Count()>0)
                    {
                        throw new Exception("Existe Comparativos registrados para {0}{1}".Fmt(local.ruc, local.descripcion));
                    }

                    if (local.OrdenCompras.Count() > 0)
                    {
                        throw new Exception("Existe Comparativos registrados para {0}{1}".Fmt(local.ruc, local.descripcion));
                    }

                    //elimina del gespag

                    this.deleteGesPag(local.ruc.Trim(), local.GettipoAnexo());
                  

                    var cuenta = _db.ProveedorCuentas.SingleOrDefault(p => p.idProveedor == local.idInternal);
                    if (cuenta!=null)
                    {
                    _db.ProveedorCuentas.DeleteOnSubmit(cuenta);
                    }
                    _db.Proveedors.DeleteOnSubmit(local);
                    _db.SubmitChanges();

                    ts.Complete();
                    result = true;
                }
                return result;
           
        }

        #endregion

#region CRUD GESPAG
        /// <summary>
        /// Recordando que solo elimina de la empresa principal de CONCAR y del GESPAG   
        /// </summary>
        /// <param name="RUC"></param>
        /// <returns></returns>
        private bool deleteGesPag(string RUC, char tipoAnexo)
        {

            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {

                dbGespagDataContext _db;
                _db = new dbGespagDataContext(Parametros.dbGesPag);

                
              //SOLO ELIMINA DEL SISTEMA DE GESPAG
  
                 //tablas gespag

                var aa = _db.CON0001PRO1s.SingleOrDefault(p => (p.PR1_CTGTPRO == tipoAnexo) & p.PR1_CCODPRO.Trim() == RUC.Trim());

                if (aa != null)
                {

                    var cON0002ANE1 = _db.CON0002ANE1s.SingleOrDefault(p => (p.AN1_CTGTPRO == aa.PR1_CTGTPRO) & p.AN1_CCODPRO.Trim() == RUC.Trim());
                    var cuentaGespaq = _db.CON0002ANE9s.Where(p => (p.PR1_CTGTPRO == aa.PR1_CTGTPRO) & p.PR1_CCODPRO.Trim() == RUC.Trim());


                    var pagos = _db.PAG0002PAG1s.Where(p => p.PA1_CTIPANE == aa.PR1_CTGTPRO & p.PA1_CCODANE.Trim() == RUC.Trim());
                    var cargos = _db.PAG0002CAR1s.Where(p => p.CT1_CTIPANE == aa.PR1_CTGTPRO & p.CT1_CCODANE.Trim() == RUC.Trim());
                    var cancelacion = _db.PAG0002CAN1s.Where(p => p.CA1_CTIPANE == aa.PR1_CTGTPRO & p.CA1_CCODANE.Trim() == RUC.Trim());

                    if (pagos.Count() > 0)
                    {
                        throw new Exception("Existe Pagos en sistema GESPAG");
                    }
                    if (cargos.Count() > 0)
                    {
                        throw new Exception("Existe Cargos en sistema GESPAG");
                    }
                    if (cancelacion.Count() > 0)
                    {
                        throw new Exception("Verifique  sistema GESPAG");
                    }

                    if (cON0002ANE1 != null)
                    {
                        _db.CON0002ANE1s.DeleteOnSubmit(cON0002ANE1);
                    }
                    if (aa != null)
                    {
                        _db.CON0001PRO1s.DeleteOnSubmit(aa);
                    }
                    if (cuentaGespaq != null)
                    {
                        _db.CON0002ANE9s.DeleteAllOnSubmit(cuentaGespaq);
                    }
                } 
                _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;

        }


        //private void AddGesPag( int idProveedor)
        //{
        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        //busca si no existe ya el proveedor
        //        //Proveedor proveedor = DbUtil.Db.Proveedors.Single(p => p.idInternal == idProveedor);
        //        //dbGespagDataContext _dbgesPag = new dbGespagDataContext(Parametros.dbGesPag);
                
        //        //var r = _dbgesPag.CON0001PRO1s.Where(p => p.PR1_CTGTPRO == 'P' & p.PR1_CCODPRO == proveedor.ruc);
        //        //if (r.Count() > 0)
        //        //{
        //        //    throw new Exception ("Existe el {0} en sistema GesPag".Fmt(proveedor.ruc));
        //        //}

        //        UpdateGesPag(idProveedor);

        //            ts.Complete();
        //    }

        //}

        //public void AddGesPag(dbGestionDataContext _dbGestion,int idProveedor)
        //{
        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        //busca si no existe ya el proveedor
        //        Proveedor proveedor = _dbGestion.Proveedors.Single(p => p.idInternal == idProveedor);

        //        dbGespagDataContext _dbgesPag = new dbGespagDataContext(Parametros.dbGesPag);

        //        dbConCarDataContext _db = new dbConCarDataContext(Parametros.dbConCar);

        //        //concar
        //        CT0001ANEX ct0001anex = _db.CT0001ANEXes.SingleOrDefault(p => p.ARUC == proveedor.ruc.Trim() & p.ADOCIDE == "P");
        //        if (ct0001anex == null)
        //        {
                
        //            ct0001anex = new CT0001ANEX();
        //            ct0001anex.SetAdd(_db,
        //                            proveedor.ruc,
        //                            Convert.ToChar(proveedor.estado),
        //                            proveedor.descripcion,
        //                            proveedor.direccionOficina,
        //                            proveedor.ruc,
        //                            proveedor.apellidoPat,
        //                            proveedor.apellidoMat,
        //                            proveedor.nombre,
        //                            proveedor.telefonoOficina1,
        //                            Convert.ToChar(proveedor.tipo),
        //                            proveedor.email,
        //                            proveedor.web,
        //                            proveedor.TipoDocumento1.idG);

        //            _db.SubmitChanges();
        //        }
        //        //tablas de respaldo

        //        CON0002ANE9 cuentaGespaq = new CON0002ANE9();
        //        var proveedorCuenta = proveedor.ProveedorCuenta; //siempre debe existir uno

        //        cuentaGespaq.SetAdd(_dbgesPag,
        //                            proveedor.codigo,
        //                            'P',
        //                            proveedor.TipoDocumento1.idG,
        //                            Convert.ToChar(proveedor.estado),
        //                            proveedor.tipo.ToString(),
        //                            proveedor.descripcion,
        //                            proveedor.abreviacion,
        //                            proveedor.apellidoPat,
        //                            proveedor.apellidoMat,
        //                            proveedor.nombre,
        //                            proveedor.ruc,
        //                            proveedor.direccionOficina,
        //                            proveedor.ubigeo,
        //                            proveedor.telefonoOficina1,
        //                            proveedor.telefonoOficina2,
        //                            proveedor.faxOficina,
        //                            proveedor.email,
        //                            proveedor.web,
        //                            proveedor.tipoAcreedor,
        //                            proveedor.giroNegocio,
        //                            proveedor.formaPagoG,
        //                            proveedor.contacto,
        //                            proveedor.clasificacion,
        //                            proveedor.importeRendir.Value,
        //                            proveedor.importeMoneda,
        //                            proveedorCuenta.teleCuentaSOL,
        //                            proveedorCuenta.teleCuentaDOL,
        //                            proveedorCuenta.teleTipoProducto,
        //                            proveedorCuenta.teleTipoDoc,
        //                            proveedorCuenta.teleDocumento,
        //                            proveedorCuenta.IntcuentaSOL,
        //                            proveedorCuenta.intcuentaDOL,
        //                            proveedorCuenta.intTipoProducto,
        //                            proveedorCuenta.intTipoBono,
        //                            proveedorCuenta.intOficina,
        //                            proveedorCuenta.nacionDetraccion,
        //                            proveedorCuenta.nacionInterBan,
        //                            proveedorCuenta.continentCuentaSOL,
        //                            proveedorCuenta.continentCuentaDOL,
        //                            proveedorCuenta.continentInterBan,
        //                            proveedorCuenta.continentFormaPago,
        //                            proveedorCuenta.continentTipoCuenta,
        //                            proveedor.detraccion,
        //                            proveedor.retencion);


        //        _dbgesPag.SubmitChanges();

        //        //luego actualizo el principal


        //        CON0001PRO1 cuentaprovee = _dbgesPag.CON0001PRO1s.SingleOrDefault(p => p.PR1_CTGTPRO == 'P' & p.PR1_CCODPRO == proveedor.ruc);
        //        if (cuentaprovee != null)
        //        {

        //            cuentaprovee.SetUpdate(
        //                                Convert.ToChar(proveedor.estado),
        //                                proveedor.descripcion,
        //                                proveedor.apellidoPat,
        //                                proveedor.apellidoMat,
        //                                proveedor.nombre,
        //                                proveedor.abreviacion,
        //                                proveedor.direccionOficina,
        //                                proveedor.ubigeo,
        //                                proveedor.telefonoOficina1,
        //                                proveedor.telefonoOficina2,
        //                                proveedor.email,
        //                                proveedor.web,
        //                                proveedor.tipoAcreedor,
        //                                proveedor.giroNegocio,
        //                                proveedor.formaPagoG,
        //                                proveedor.contacto,
        //                                proveedor.clasificacion,
        //                                proveedor.importeMoneda,
        //                                proveedor.importeRendir.Value,
        //                                proveedorCuenta.teleCuentaSOL,
        //                                proveedorCuenta.teleCuentaDOL,
        //                                proveedorCuenta.teleTipoProducto,
        //                                proveedorCuenta.teleTipoDoc,
        //                                proveedorCuenta.teleDocumento,
        //                                proveedorCuenta.teleInterBan,
        //                                proveedorCuenta.IntcuentaSOL,
        //                                proveedorCuenta.intcuentaDOL,
        //                                proveedorCuenta.intTipoProducto,
        //                                proveedorCuenta.intTipoBono,
        //                                proveedorCuenta.intOficina,
        //                                proveedorCuenta.intInterBan,
        //                                proveedorCuenta.intTipoDocumento,
        //                                proveedorCuenta.intNroDocumento,
        //                                proveedorCuenta.nacionDetraccion,
        //                                proveedorCuenta.nacionInterBan,
        //                                proveedor.importeRendir.Value,
        //                                proveedor.importeMoneda,
        //                                proveedorCuenta.continentCuentaSOL,
        //                                proveedorCuenta.continentCuentaDOL,
        //                                proveedorCuenta.continentFormaPago,
        //                                proveedorCuenta.continentTipoCuenta,
        //                                proveedorCuenta.continentInterBan,
        //                                Convert.ToChar(proveedorCuenta.continenttipoDoc),
        //                                proveedorCuenta.continentNroDoc,
        //                                proveedor.detraccion,
        //                                proveedor.retencion,
        //                                "SIST"
        //                                );


        //            _dbgesPag.SubmitChanges();
        //        }
        //        else
        //        {

        //            cuentaprovee = new CON0001PRO1();
        //            cuentaprovee.SetAdd(_dbgesPag,
        //                                 proveedor.ruc,
        //                                 Convert.ToChar(proveedor.estado),
        //                                 proveedor.tipo.ToString(),
        //                                 proveedor.TipoDocumento1.idG,
        //                                 proveedor.ruc,
        //                                 proveedor.descripcion,
        //                                 proveedor.apellidoPat,
        //                                 proveedor.apellidoMat,
        //                                 proveedor.nombre,
        //                                 proveedor.abreviacion,
        //                                 proveedor.direccionOficina,
        //                                 proveedor.ubigeo,
        //                                 proveedor.telefonoOficina1,
        //                                 proveedor.telefonoOficina2,
        //                                 proveedor.email,
        //                                 proveedor.web,
        //                                 proveedor.tipoAcreedor,
        //                                 proveedor.giroNegocio,
        //                                 proveedor.formaPagoG,
        //                                 proveedor.contacto,
        //                                 proveedor.clasificacion,
        //                                 proveedor.importeMoneda,
        //                                 proveedor.importeRendir.Value,
        //                                 proveedorCuenta.teleCuentaSOL,
        //                                 proveedorCuenta.teleCuentaDOL,
        //                                 proveedorCuenta.teleTipoProducto,
        //                                 proveedorCuenta.teleTipoDoc,
        //                                 proveedorCuenta.teleDocumento,
        //                                 proveedorCuenta.teleInterBan,
        //                                 proveedorCuenta.IntcuentaSOL,
        //                                 proveedorCuenta.intcuentaDOL,
        //                                 proveedorCuenta.intTipoProducto,
        //                                 proveedorCuenta.intTipoBono,
        //                                 proveedorCuenta.intOficina,
        //                                 proveedorCuenta.intInterBan,
        //                                 proveedorCuenta.intTipoDocumento,
        //                                 proveedorCuenta.intNroDocumento,
        //                                 proveedorCuenta.nacionDetraccion,
        //                                 proveedorCuenta.nacionInterBan,
        //                                 proveedor.importeRendir.Value,
        //                                 proveedor.importeMoneda,
        //                                 proveedorCuenta.continentCuentaSOL,
        //                                 proveedorCuenta.continentCuentaDOL,
        //                                 proveedorCuenta.continentFormaPago,
        //                                 proveedorCuenta.continentTipoCuenta,
        //                                 proveedorCuenta.continentInterBan,
        //                                 Convert.ToChar(proveedorCuenta.continenttipoDoc),
        //                                 proveedorCuenta.continentNroDoc,
        //                                 proveedor.detraccion,
        //                                 proveedor.retencion,
        //                                 "SIST"
        //                                 );
        //            _dbgesPag.SubmitChanges();
        //        }


        //        ts.Complete();
        //    }
                                                                     
        //}

        //public CON0001PRO1 GetProveedorGespag(dbGespagDataContext _db, string ruc)
        //{
            


        //        var todos= _db.CON0001PRO1s.Where(p => (p.PR1_CTGTPRO == 'P' | p.PR1_CTGTPRO == 'H'|p.PR1_CTGTPRO == 'V')
        //                                                & p.PR1_CCODPRO.Trim() == ruc.Trim());

        //          CON0001PRO1 uno=null;
        //          if (todos.Count() > 0)
        //          {
        //              uno = todos.SingleOrDefault(p => p.PR1_CTGTPRO == 'P') != null ? todos.SingleOrDefault(p => p.PR1_CTGTPRO == 'P') : todos.First();
        //          }
        //          return uno;

        //}

     

           


/// <summary>
/// registro del proveedor en el gespag
/// tipoProveedor es  realizado en el P o H por default es P
/// se convierte segun
/// </summary>
/// <param name="_dbGestion"></param>
/// <param name="idProveedor"></param>
/// <param name="tipoProveedor"> lo entrrega el documento</param>
        public void UpdateGesPag(dbGestionDataContext _dbGestion, int idProveedor,char tipoAnexo)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //busca si no existe ya el proveedor
                Proveedor proveedor =_dbGestion.Proveedors.Single(p => p.idInternal == idProveedor);

                dbGespagDataContext _dbgesPag = new dbGespagDataContext(Parametros.dbGesPag);

                dbConCarDataContext _db = new dbConCarDataContext(Parametros.dbConCar);


               

                 //------------------------------CONCAR---------------------

                CT0001ANEX ct0001anex =_db.CT0001ANEXes.SingleOrDefault(p => (p.AVANEXO == tipoAnexo)
                                                        & p.ACODANE.Trim() == proveedor.ruc.Trim());
                try
                {

               

                if (ct0001anex  != null)
                {
                    ct0001anex.SetUpdate(tipoAnexo,Convert.ToChar(proveedor.estado),
                                           proveedor.descripcion,
                                           proveedor.direccionOficina,
                                           proveedor.apellidoPat,
                                           proveedor.apellidoMat,
                                           proveedor.nombre,
                                           proveedor.telefonoOficina1,
                                           proveedor.email,
                                           proveedor.web
                                        );
                    _db.SubmitChanges();
                }
                else
                {

                     ct0001anex = new CT0001ANEX();
                     ct0001anex.SetAdd(_db,tipoAnexo,
                                    proveedor.ruc,
                                    Convert.ToChar(proveedor.estado),
                                    proveedor.descripcion,
                                    proveedor.direccionOficina,
                                    proveedor.ruc,
                                    proveedor.apellidoPat,
                                    proveedor.apellidoMat,
                                    proveedor.nombre,
                                    proveedor.telefonoOficina1,
                                    Convert.ToChar(proveedor.tipo),
                                    proveedor.email,
                                    proveedor.web,
                                    proveedor.TipoDocumento1.idG);
                    _db.CT0001ANEXes.InsertOnSubmit(ct0001anex);
                    _db.SubmitChanges();
                }
                 //---------------------------------------------------------
                //tablas de respaldo  GESPAG
                    //problemas en al realizar la tranzaccion por problemas de fecha

                //CON0002ANE9 cuentaGespaq = new CON0002ANE9();


                var proveedorCuenta = _dbGestion.ProveedorCuentas.Single(p => p.idProveedor == idProveedor);
                ////siempre debe existir uno  GESTION

                //    cuentaGespaq.SetAdd(_dbgesPag,
                //                        proveedor.codigo,
                //                        tipoAnexo,
                //                        proveedor.TipoDocumento1.idG,
                //                        Convert.ToChar(proveedor.estado),
                //                        proveedor.tipo.ToString(),
                //                        proveedor.descripcion,
                //                        proveedor.abreviacion,
                //                        proveedor.apellidoPat,
                //                        proveedor.apellidoMat,
                //                        proveedor.nombre,
                //                        proveedor.ruc,
                //                        proveedor.direccionOficina,
                //                        proveedor.ubigeo,
                //                        proveedor.telefonoOficina1,
                //                        proveedor.telefonoOficina2,
                //                        proveedor.faxOficina,
                //                        proveedor.email,
                //                        proveedor.web,
                //                        proveedor.tipoAcreedor,
                //                        proveedor.giroNegocio,
                //                        proveedor.formaPagoG,
                //                        proveedor.contacto,
                //                        proveedor.clasificacion,
                //                        proveedor.importeRendir.Value,
                //                        proveedor.importeMoneda,
                //                        proveedorCuenta.teleCuentaSOL,
                //                        proveedorCuenta.teleCuentaDOL,
                //                        proveedorCuenta.teleTipoProducto.ToString(),
                //                        proveedorCuenta.teleTipoDoc.ToString(),
                //                        proveedorCuenta.teleDocumento,
                //                        proveedorCuenta.IntcuentaSOL,
                //                        proveedorCuenta.intcuentaDOL,
                //                        proveedorCuenta.intTipoProducto,
                //                        proveedorCuenta.intTipoBono,
                //                        proveedorCuenta.intOficina,
                //                        proveedorCuenta.nacionDetraccion,
                //                        proveedorCuenta.nacionInterBan,
                //                        proveedorCuenta.continentCuentaSOL,
                //                        proveedorCuenta.continentCuentaDOL,
                //                        proveedorCuenta.continentInterBan,
                //                        proveedorCuenta.continentFormaPago.ToString(),
                //                        proveedorCuenta.continentTipoCuenta,
                //                        proveedor.detraccion,
                //                        proveedor.retencion,
                //                         proveedorCuenta.scotiaCuentaSOL,
                //                        proveedorCuenta.scotiaCuentaDOL,
                //                        proveedorCuenta.scotiaInterBan,
                //                        proveedorCuenta.scotiaFormaPago);

               
                //_dbgesPag.SubmitChanges();

                //luego actualizo el principal


                CON0001PRO1 cuentaprovee = _dbgesPag.CON0001PRO1s.SingleOrDefault(p => (p.PR1_CTGTPRO == tipoAnexo)
                                                      & p.PR1_CCODPRO.Trim() == proveedor.ruc.Trim());
                if (cuentaprovee  != null)
                {

                    cuentaprovee.SetUpdate( tipoAnexo,
                                        Convert.ToChar(proveedor.estado),
                                        proveedor.descripcion,
                                        proveedor.apellidoPat,
                                        proveedor.apellidoMat,
                                        proveedor.nombre,
                                        proveedor.abreviacion,
                                        proveedor.direccionOficina,
                                        proveedor.ubigeo,
                                        proveedor.telefonoOficina1,
                                        proveedor.telefonoOficina2,
                                        proveedor.email,
                                        proveedor.web,
                                        proveedor.tipoAcreedor,
                                        proveedor.giroNegocio,
                                        proveedor.formaPagoG,
                                        proveedor.contacto,
                                        proveedor.clasificacion,
                                        proveedor.importeMoneda,
                                        proveedor.importeRendir.Value,
                                        proveedorCuenta.teleCuentaSOL,
                                        proveedorCuenta.teleCuentaDOL,
                                        proveedorCuenta.teleTipoProducto,
                                        proveedorCuenta.teleTipoDoc,
                                        proveedorCuenta.teleDocumento,
                                        proveedorCuenta.teleInterBan,
                                        proveedorCuenta.IntcuentaSOL,
                                        proveedorCuenta.intcuentaDOL,
                                        proveedorCuenta.intTipoProducto,
                                        proveedorCuenta.intTipoBono,
                                        proveedorCuenta.intOficina,
                                        proveedorCuenta.intInterBan,
                                        proveedorCuenta.intTipoDocumento,
                                        proveedorCuenta.intNroDocumento,
                                        proveedorCuenta.nacionDetraccion,
                                        proveedorCuenta.nacionInterBan,
                                        proveedor.importeRendir.Value,
                                        proveedor.importeMoneda,
                                        proveedorCuenta.continentCuentaSOL,
                                        proveedorCuenta.continentCuentaDOL,
                                        proveedorCuenta.continentFormaPago,
                                        proveedorCuenta.continentTipoCuenta,
                                        proveedorCuenta.continentInterBan,
                                        proveedorCuenta.continenttipoDoc,
                                        proveedorCuenta.continentNroDoc,
                                        proveedor.detraccion,
                                        proveedor.retencion,
                                        proveedorCuenta.scotiaCuentaSOL,
                                        proveedorCuenta.scotiaCuentaDOL,
                                        proveedorCuenta.scotiaInterBan,
                                        proveedorCuenta.scotiaFormaPago,
                                        "SIST"
                                        );


                    _dbgesPag.SubmitChanges();
                }
                else
                {

                    cuentaprovee = new CON0001PRO1();
                    cuentaprovee.SetAdd(_dbgesPag,tipoAnexo,
                                         proveedor.ruc,
                                         Convert.ToChar(proveedor.estado),
                                         proveedor.tipo.ToString(),
                                         proveedor.TipoDocumento1.idG,
                                         proveedor.ruc,
                                         proveedor.descripcion,
                                         proveedor.apellidoPat,
                                         proveedor.apellidoMat,
                                         proveedor.nombre,
                                         proveedor.abreviacion,
                                         proveedor.direccionOficina,
                                         proveedor.ubigeo,
                                         proveedor.telefonoOficina1,
                                         proveedor.telefonoOficina2,
                                         proveedor.email,
                                         proveedor.web,
                                         proveedor.tipoAcreedor,
                                         proveedor.giroNegocio,
                                         proveedor.formaPagoG,
                                         proveedor.contacto,
                                         proveedor.clasificacion,
                                         proveedor.importeMoneda,
                                         proveedor.importeRendir.Value,
                                         proveedorCuenta.teleCuentaSOL,
                                         proveedorCuenta.teleCuentaDOL,
                                         proveedorCuenta.teleTipoProducto,
                                         proveedorCuenta.teleTipoDoc,
                                         proveedorCuenta.teleDocumento,
                                         proveedorCuenta.teleInterBan,
                                         proveedorCuenta.IntcuentaSOL,
                                         proveedorCuenta.intcuentaDOL,
                                         proveedorCuenta.intTipoProducto,
                                         proveedorCuenta.intTipoBono,
                                         proveedorCuenta.intOficina,
                                         proveedorCuenta.intInterBan,
                                         proveedorCuenta.intTipoDocumento,
                                         proveedorCuenta.intNroDocumento,
                                         proveedorCuenta.nacionDetraccion,
                                         proveedorCuenta.nacionInterBan,
                                         proveedor.importeRendir.Value,
                                         proveedor.importeMoneda,
                                         proveedorCuenta.continentCuentaSOL,
                                         proveedorCuenta.continentCuentaDOL,
                                         proveedorCuenta.continentFormaPago,
                                         proveedorCuenta.continentTipoCuenta,
                                         proveedorCuenta.continentInterBan,
                                         proveedorCuenta.continenttipoDoc,
                                         proveedorCuenta.continentNroDoc,
                                         proveedor.detraccion,
                                         proveedor.retencion,
                                         proveedorCuenta.scotiaCuentaSOL,
                                         proveedorCuenta.scotiaCuentaDOL,
                                         proveedorCuenta.scotiaInterBan,
                                         proveedorCuenta.scotiaFormaPago,
                                         "SIST"
                                         );
                    _dbgesPag.SubmitChanges();
                }


                ts.Complete();
                }
                catch (SqlException sqlex)
                {

                    throw new Exception("{0}-{1}".Fmt(idProveedor, sqlex));
                }
                catch (Exception ex)
                {

                    throw new Exception("{0}-{1}".Fmt(idProveedor, ex));
                }
            }

        }

        #endregion

        int _count;
        public int Count( string proveedorStr,int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }

  [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getProveedorAll(string prefixText, int count)
        {
 
            var p = (from a in DbUtil.Db.Proveedors
                     where (a.codigo + a.descripcion).Contains(prefixText) 
                    
                     select new SearchProveedor
                     {
                         idInternal=a.idInternal,
                         descripcion=a.descripcion,
                         ruc=a.ruc,
                         vista=string.Format("{0} - {1}",a.ruc,a.descripcion) ,
                         contacto=a.contacto

                     }).Take(count);

            return Util.Tbl2Str(Util.EntidadToDataTable(p));

        }



  [DataObjectMethod(DataObjectMethodType.Select, false)]
  public string getProveedorMasEmpleadoAll(string prefixText, int count)
  {

      var p = (from a in DbUtil.Db.Proveedors
               where (a.codigo + a.descripcion).Contains(prefixText)

               select new SearchProveedor
               {
                   idInternal = a.idInternal,
                   descripcion = a.descripcion,
                   ruc = a.ruc,
                   vista = string.Format("P-{0} - {1}", a.ruc, a.descripcion),
                   contacto = "PROVEEDOR"

               }).Take(count);


      var q = (from a in DbUtil.Db.Empleados
               where (a.dni + a.descripcion).Contains(prefixText)

               select new SearchProveedor
               {
                   idInternal = a.idInternal,
                   descripcion = a.descripcion,
                   ruc = a.dni,
                   vista = string.Format("E-DNI{0} - {1}", a.dni, a.descripcion),
                   contacto = "EMPLEADO"

               }).Take(count);
      var pi = p.Union(q);

      return Util.Tbl2Str(Util.EntidadToDataTable(pi));

  }


  [DataObjectMethod(DataObjectMethodType.Select, false)]
  public string getProveedorComparativoAll(string prefixText, int count,int idObra)
  {

      var p = (from a in DbUtil.Db.Comparativos
               where (a.Proveedor.descripcion).Contains(prefixText)
               & a.idObra==idObra
               select new DescripcionInfo
               {
                   descripcion = a.Proveedor.descripcion

               }).Distinct().Take(count);

      return Util.Tbl2Str(Util.EntidadToDataTable(p));


  }



  [DataObjectMethod(DataObjectMethodType.Select, false)]
  public string getProveedorOrdenCompraAll(string prefixText, int count, int idObra)
  {

      var p = (from a in DbUtil.Db.OrdenCompras
               where 
               (a.proveedor.Contains(prefixText)
                |a.docProveedor.Contains(prefixText))
               & a.idObra == idObra
               select new DescripcionInfo
               {
                   descripcion = a.proveedor

               }).Distinct().Take(count);

      return Util.Tbl2Str(Util.EntidadToDataTable(p));


  }


  [DataObjectMethod(DataObjectMethodType.Select, false)]
  public string getProveedorRecepcionDocAll(string prefixText, int count, int idObra)
  {

      var p = (from a in DbUtil.Db.RecepcionDocs
               where
               (a.proveedor.Contains(prefixText)
                | a.ruc.Contains(prefixText))
               & a.idObra == idObra
               select new DescripcionInfo
               {
                   descripcion =a.proveedor

               }).Distinct().Take(count);

      return Util.Tbl2Str(Util.EntidadToDataTable(p));


  }



        private IQueryable<ProveedorListInfo> ApplySort(IQueryable<ProveedorListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "anexoOficina":
                    q = q.OrderBy(b => b.anexoOficina);
                    break;
                case "anexoOficina DESC":
                    q = q.OrderByDescending(b => b.anexoOficina);
                    break;
                case "codigo":
                    q = q.OrderBy(b => b.codigo);
                    break;
                case "codigo DESC":
                    q = q.OrderByDescending(b => b.codigo);
                    break;
                case "contacto":
                    q = q.OrderBy(b => b.contacto);
                    break;
                case "contacto DESC":
                    q = q.OrderByDescending(b => b.contacto);
                    break;

                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;


                case "direccionOficina":
                    q = q.OrderBy(b => b.direccionOficina);
                    break;
                case "direccionOficina DESC":
                    q = q.OrderByDescending(b => b.direccionOficina);
                    break;


                case "email":
                    q = q.OrderBy(b => b.email);
                    break;
                case "email DESC":
                    q = q.OrderByDescending(b => b.email);
                    break;
                case "emailContacto":
                    q = q.OrderBy(b => b.emailContacto);
                    break;
                case "emailContacto DESC":
                    q = q.OrderByDescending(b => b.emailContacto);
                    break;
                case "formaPago":
                    q = q.OrderBy(b => b.formaPago);
                    break;
                case "formaPago DESC":
                    q = q.OrderByDescending(b => b.formaPago);
                    break;

                case "web":
                    q = q.OrderBy(b => b.web);
                    break;
                case "web DESC":
                    q = q.OrderByDescending(b => b.web);
                    break;

                
                default:
                    q = q.OrderByDescending(b => b.idInternal);
                    break;
            }
            return q;
        }

       
              [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<ProveedorListInfo> getProveedorList(string proveedorStr, int startRowIndex, int maximumRows, string sortExpression)
        {

            if (!proveedorStr.HasValue())
                proveedorStr = "";

            var q = from a in DbUtil.Db.Proveedors
                    where a.descripcion.Contains(proveedorStr) | a.ruc.Contains(proveedorStr)
                    select new ProveedorListInfo
                    {
                        anexoOficina = a.anexoOficina,
                        codigo = a.codigo,
                        contacto = a.contacto,
                        descripcion = a.descripcion,
                        direccionOficina = a.direccionOficina,
                        email = a.email,
                        emailContacto = a.emailContacto,
                        formaPago = a.FormaPago.descripcion,
                        idInternal = a.idInternal,
                        ruc = a.ruc,
                        telefonoOficina1 = a.telefonoOficina1,
                        web = a.web
                    };
            

            _count = q.Count();
            q = ApplySort(q, sortExpression);

            return q.Skip(startRowIndex).Take(maximumRows);



        }

             
       public void  updatecuentasGespagNeglog()
       {   
           
           dbGespagDataContext _dbGespag= new dbGespagDataContext(Parametros.dbGesPag);

           var q= from a in DbUtil.Db.ProveedorCuentas
                  select a;

           foreach (var item in q)
	            {
                    var ii = _dbGespag.CON0001PRO1s.Where(p => p.PR1_CCODPRO.Trim() == item.Proveedor.ruc.Trim() 
                                        & (p.PR1_CTGTPRO == item.Proveedor.GettipoAnexo()));
               if (ii.Count()>0)

               {
                   var i = ii.First();
                   
                   item.updateFromGespag(i.PR1_CTECTMN, 
                       i.PR1_CTECTUS,
                       i.PR1_CTETIPR, 
                       i.PR1_CTETIDO, 
                       i.PR1_CTENRDO,
                       i.PR1_CTECTIN, 
                       i.PR1_CINCTMN, 
                       i.PR1_CINCTUS, 
                       i.PR1_CINTIPR, 
                       i.PR1_CINTIAB,
                                         i.PR1_CINOFIC, i.PR1_CINTIDO, i.PR1_CINNRDO, i.PR1_CINCTIN, i.PR1_CBVCTMN,
                                         i.PR1_CBVCTUS, 
                                         i.PR1_CBVFOPA, 
                                         i.PR1_CBVTPCT, i.PR1_CBVTIDO, i.PR1_CBVNRDO,
                                         i.PR1_CBVCTIN, i.PR1_CNACTNA, i.PR1_CNACTIN,i.PR1_CSCCTMN,i.PR1_CSCCTUS,
                                         i.PR1_CSCCTIN,
                                         i.PR1_CSCFOPA,
                                         1);
                   DbUtil.Db.SubmitChanges();
               }


	            }


           

           



           
       }

    }
}
